package com.douyu.water.util;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.ezmorph.object.DateMorpher;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;
import net.sf.json.util.JSONUtils;
import net.sf.json.util.PropertyFilter;


/**
 * json工具类
 * 
 * @author lld 2013-8-2 上午11:33:16
 */
public class JsonUtil {

    public static final String DEFAULT_ENCODING = "UTF-8";
    public static String dateFormat = "yyyy-MM-dd HH:mm:ss";

    /**
     * 获取json配置信息. 
     * @return
     */
    public static JsonConfig registeJsonConfig() {
        JsonConfig jsonConfig = new JsonConfig();
        jsonConfig.setArrayMode(JsonConfig.MODE_LIST);
        
        jsonConfig.setJsonPropertyFilter(new PropertyFilter() {
            @Override
            public boolean apply(Object source, String name, Object value) {
                // TODO Auto-generated method stub
                if (value == null || ((value instanceof String) && ("".equals((String) value)))) {
            	//if(value == null)
                	//{
                    return true;
                }
            	
                return false;
            }

        });
        // 日期字符串转date类型
        JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(new String[] { dateFormat }));
        // 日期默认值类型转换器
        jsonConfig.registerJsonValueProcessor(Date.class, new JsonValueProcessor() {
            @Override
            public Object processObjectValue(String key, Object value, JsonConfig arg2) {
                // TODO Auto-generated method stub
                SimpleDateFormat format = new SimpleDateFormat(dateFormat);
                if (value != null && !"".equals(value)) {
                    return format.format(value);
                }
                return "";
            }

            @Override
            public Object processArrayValue(Object value, JsonConfig arg1) {
                // TODO Auto-generated method stub
                return value;
            }
        });
        
        // 数值默认值类型转换器
        jsonConfig.registerJsonValueProcessor(Float.class, new JsonValueProcessor() {
            @Override
            public Object processObjectValue(String key, Object value, JsonConfig arg2) {
                // TODO Auto-generated method stub
                return value == null ? "0" : getValue(value);
            }
           
            private Object getValue(Object value)
            {
            	if(value instanceof Float)
            	{
            		float temp = ((Float) value).floatValue();
            		DecimalFormat format = new DecimalFormat("0.00");
            		String num = format.format(temp);            		
            		return num;
            	}
            	else
            	{
            		return value;
            	}
            }
            @Override
            public Object processArrayValue(Object value, JsonConfig arg1) {
                // TODO Auto-generated method stub
                return value;
            }
        });
//        // 数值默认值类型转换器
//        jsonConfig.registerJsonValueProcessor(Float.class, new JsonValueProcessor() {
//            @Override
//            public Float processObjectValue(String key, Object value, JsonConfig arg2) {
//                return  value == null ? 0f : getValue(value);
//            }
//            
//            private float getValue(Object value)
//            {
//            	
//            	    float temp = ((Float)value).floatValue();
//            		DecimalFormat df = new DecimalFormat("0.00");
//            		temp = Float.parseFloat(df.format(temp));
//            		return temp;
//            	
//            }
//            @Override
//            public Object processArrayValue(Object value, JsonConfig arg1) {
//                // TODO Auto-generated method stub
//                return value;
//            }
//        });
        return jsonConfig;
    }

    /**
     * 将list转换成jsonArray
     *           
     * @param list
     *            被转换的集合
     * @param excludePropertys
     *            需要过滤的属性
     * @return
     */
    public static JSONArray convertListToJSONArray(List<?> list, String[] excludePropertys) {
        JsonConfig jsonConfig = registeJsonConfig();
        if (excludePropertys != null && excludePropertys.length > 0) {
            jsonConfig.setExcludes(excludePropertys);
        }
        return JSONArray.fromObject(list, jsonConfig);
    }

    /**
     * 将object转换成jsonArray
     * 
     * @param o
     *            被转换的对象
     * @param excludePropertys
     *            需要过滤的属性
     * @return
     */
    public static JSONArray convertObjectToJSONArray(Object o, String[] excludePropertys) {
        List<Object> list = new ArrayList<Object>();
        list.add(o);
        return JsonUtil.convertListToJSONArray(list, excludePropertys);
    }
    /**
      * 将object转换成jsonObject
     * 
     * @param obj
     *            被转换的对象
     * @param excludePropertys
     *            需要过滤的属性
     * @return JSONObject
     * */
    public static JSONObject convertObjectToJSONObject(Object obj)
    {
    	JsonConfig jsonConfig = registeJsonConfig();    	
    	return JSONObject.fromObject(obj,jsonConfig);
    }
    /**
     * 将对象转换成json字符串
     * 
     * @param obj
     * @return
     */
    public static String convertObj2Str(Object obj) {
        JsonConfig jsonConfig = registeJsonConfig();
        return JSONObject.fromObject(obj, jsonConfig).toString();
    }

    /**
     * 将json字符串转换为class类对象,class类中引用其他的class
     * @param classMap
     *            bean类中嵌套的类集合
     * @param beanClass
     *            转换成的bean类型
     * @param convertStr
     *            被转换的json字符串
     * @return
     */
    public static Object convertStr2Obj(Map<String, Class> classMap, Class beanClass, String convertStr) {
        if (convertStr == null || "".equals(convertStr.trim())) {
            return null;
        }
        JsonConfig jsonConfig = registeJsonConfig();
        JSONObject jsonObject = JSONObject.fromObject(convertStr, jsonConfig);
        return JSONObject.toBean(jsonObject, beanClass, classMap);
    }

    /**
     * 将json字符串转换为class类对象
     * @param beanClass
     * @param convertStr
     * @return
     */
    public static Object convertStr2Obj(Class beanClass, String convertStr) {
        if (convertStr == null || "".equals(convertStr.trim())) {
            return null;
        }
        Map<String, Class> classMap = new HashMap<String, Class>();
        JsonConfig jsonConfig = registeJsonConfig();
        JSONObject jsonObject = JSONObject.fromObject(convertStr, jsonConfig);
        return JSONObject.toBean(jsonObject, beanClass, classMap);
    }
    
    public static List convertStr2List(Class beanClass, String convertStr) {
        if (convertStr == null || "".equals(convertStr.trim())) {
            return null;
        }
        Map<String, Class> classMap = new HashMap<String, Class>();
        JsonConfig jsonConfig = registeJsonConfig();
        JSONArray jsonArray = JSONArray.fromObject(convertStr, jsonConfig);
        return JSONArray.toList(jsonArray, beanClass, classMap);
    }
     public static void main(String[] args)
     {
//    	 PushMsg pr = new PushMsg();
//		 System.out.println(convertObjectToJSONObject(pr).toString());
     }
}
